
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>

void process(int n)
{
    int matrix[n][n];
    int bottom=n-1;
    int top=0;
    int left=0;
    int right=n-1;
    int value=25;
    while(value<=n*n)
    {
        for(int i=left;i<=right;i++)
        {
            matrix[bottom][i]=value;//从左到右，行不变，列递增
            value--;
        }
        bottom--;//下边界向上移动一行
        for(int i=bottom;i>=top;i--)
        {
            matrix[i][right]=value;
            value--;//从下到上，列不变，行递减
        }
        right--;//右边界向左移动一行
        for(int i=right;i>=left;i--)
        {
            matrix[top][i]=value;
            value--;//右到左，行不变，列递减
        }
        top++;//上边界向下移动一行
        for(int i=top;i<=bottom;i++)
        {
            matrix[left][i]=value;
            value--;//从上到下，列不变，行递增
        }
        left++;//左边界右移一列
    }

        for (int i = 0; i < n; i++)
         {
            for (int j = 0; j < n; j++)
            {
            printf("%2d ", matrix[i][j]);
            }
        printf("\n");
        }
}

int main() {
    int n;
    scanf("%d", &n);
    process(n);
    return 0;
}

// #include <stdio.h>

// void process(int n) {
//     int matrix[n][n];
//     // 首先定义四个变量，分别代表矩阵的上下左右四个边界
//     int top = 0;
//     int bottom = n - 1;
//     int left = 0;
//     int right = n - 1;

//     int value = 1;
//     while(value <= n*n){
//         for(int i = left; i <= right; i++) {
//         	matrix[top][i] = value; // 从左到右，行不变，列变化
//         	value++;
//         }
//         top++; // 上边界向下移动一行
//         for(int i = top; i <= bottom; i++) {
//         	matrix[i][right] = value; // 从上到下，列不变，行变化
//         	value++;
//         }
//         right--; // 右边界向左移动一列
//         for(int i = right; i >= left ; i--) {
//         	matrix[bottom][i] = value; // 从右到左，行不变，列变化
//         	value++;
//         }
//         bottom--; // 下边界向上移动一行
//         for(int i = bottom; i >= top; i--) {
//         	matrix[i][left] = value; // 从下到上，列不变，行变化
//         	value++;
//         }
//         left++; // 左边界向右移动一列
//     }
//     // matrix[0][0]=1 matrix[0][1]=2 matrix[0][2]=3 matrix[0][3]=4 
//     // matrix[1][0]=12 matrix[1][1]=13 matrix[1][2]=14 matrix[1][3]=5 
//     // matrix[2][0]=11 matrix[2][1]=16 matrix[2][2]=15 matrix[2][3]=6 
//     // matrix[3][0]=10 matrix[3][1]=9 matrix[3][2]=8 matrix[3][3]=7 
//     // 以上就是n=4时的内容

//     // 上面的代码已经把二维数组填充完成了，下面打印二维数组
//     for (int i = 0; i < n; i++) {
//         for (int j = 0; j < n; j++) {
//             printf("%2d ", matrix[i][j]);
//         }
//         printf("\n");
//     }
// }

// int main() {
//     int n;
//    // printf("please input num:");
//     scanf("%d", &n);
//     process(n);
//     return 0;
// }


// #include <stdio.h>

// /**
//  * 这个函数的参数是一个指向字符数组的指针，也就是说这个函数可以接收一个字符串， *s是一个指针，指向传入的字符串的第一个字符
//  * 当你传入“hello world”这个字符串时，*s指向的是'h'这个字符
//  */
// void process(char *s) {
//     int cnt = 0; // cnt用来记录当前判断到了单词的第几个字符
//     while (*s!='\0') // 当*s指向的字符不是字符串结束符时，继续循环
//     {
//         if (*s == ' ' || *s == ',' || *s == '.' || *s == '!' || *s == '?') { // 如果当前字符是空格或者逗号或者句号或者感叹号或者问号，那么cnt清零
//             cnt = 0; // cnt清零，表示进入到了下一个单词。所以要从0开始计数
//         } 
//         else {
//             if (cnt ==1) { // cnt == 1 说明当前字符是单词的第二个字符
//                 if (*s >= 'a' && *s <= 'z') {
//                     *s = *s - 32;  // 如果当前字符是小写字母，那么转换为大写字母
//                 }
//             }
//             cnt++; // 每判断一个字符，cnt加1
//         }
//         s++; // 指针后移，指向下一个字符。为什么指针+1就代表后移呢？因为指针是一个地址，对于数组来说，数组的每个元素的地址是连续的，所以指针+1就代表后移一个元素。
//             // 假设第一个字符的地址是0x1000，那么第二个字符的地址就是0x1001，第三个字符的地址就是0x1002，以此类推
//     }
// }


// int main() {
//     char s[200];
//     gets(s); // 从控制台读取一行字符串， 类似于scanf，只不过scanf读取的是单个字符，gets读取的是一行字符串
//     process(s);
//     puts(s); // 输出最终的字符串，功能printf一样，只不过专门用来打印字符串
//     return 0;
// }
